package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.Role;
import cn.itcast.service.system.ModuleService;
import cn.itcast.service.system.RoleService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//角色管理
@Controller
@RequestMapping("/system/role")
public class RoleController extends BaseController {
    @Autowired
    private RoleService roleService;
    @Autowired
    private ModuleService moduleService;

    /**
     * 分页显示
     * 访问路径： //http://localhost:8080/system/role/list.do
     * 方法参数：pageNum=1&pageSize=5
     * 方法返回：/WEB-INF/pages/system/user/user-list.jsp
     */
    @RequestMapping("/list")
    public String list(@RequestParam(defaultValue = "1") int pageNum,
                       @RequestParam(defaultValue = "5") int pageSize
    ) {//获取登录的企业ID（需要改的）
        String companyId = getLoginCompanyId();
//1.查询数据
        PageInfo pageInfo = roleService.findByPage(pageNum, pageSize, companyId);

        //2.存入request
        request.setAttribute("pageInfo", pageInfo);

        return "system/role/role-list";
    }

    /**
     * 添加角色页面
     * 访问路径：  http://localhost:8080/system/role/toAdd.do
     * 方法参数：
     * 方法返回：/role/role-add
     */
    @RequestMapping("/toAdd")
    public String toAdd() {
        return "system/role/role-add";
    }

    /*修改角色页面
    访问路径：http://localhost:8080/system/role/toUpdate.do?
            * 方法参数：id=501f17ad-17ef-4be0-af30-2e04951862ba
            * 方法返回：/system/role/role-update.jsp*/
    @RequestMapping("/toUpdate")
    public String toUpdate(String id) {
        Role role = roleService.findById(id);
        request.setAttribute("role", role);
        return "system/role/role-update";
    }


    /**
     * 添加角色和修改角色
     * 访问路径： http://localhost:8080/system/role/.do
     * 方法参数：
     * 方法返回："redirect:/system/role/list.do"
     */
    @RequestMapping("/edit")
    public String edit(Role role) {
        //获取企业信息
        String companyId = getLoginCompanyId();
        String companyName = getLoginCompanyName();
        //存入对象中
        role.setCompanyId(companyId);
        role.setCompanyName(companyName);
        if (role.getId() == "" || role.getId() == null) {
            roleService.save(role);
        } else {
            roleService.update(role);
        }
        return "redirect:/system/role/list.do";
    }

    /**
     * 删除角色
     * 访问路径： http://localhost:8080/system/role/delete.do?
     * 方法参数：id=501f17ad-17ef-4be0-af30-2e04951862ba
     * 方法返回："redirect:/system/role/list.do"
     */
    @RequestMapping("/delete")
    public String delete(String id) {

        roleService.delete(id);
        return "redirect:/system/role/list.do";
    }


    /**
     * //修改权限页面
     * 访问路径：  http://localhost:8080/system/role/roleModule.do?
     * 方法参数：roleid=4028a1c34ec2e5c8014ec2ebf8430001
     * 方法返回：role-module.jsp
     */
    @RequestMapping("/roleModule")
    public String roleModule(String roleid) {
        //查询该角色数据
        Role role = roleService.findById(roleid);

        //存入request
        request.setAttribute("role", role);
        return "/system/role/role-module";
    }

    /**
     * //修改权限页面异步查询模块
     * 访问路径：  /system/role/getZtreeNodes.do
     * 方法参数：roleid=4028a1c34ec2e5c8014ec2ebf8430001
     * 方法返回：json字符窜
     */
    @RequestMapping("/getZtreeNodes")
    @ResponseBody // 转换json数据
    public List<Map<String, Object>> getZtreeNodes(String roleid) {
        List<Map<String, Object>> list = new ArrayList<>();
        //2.查询所有模块数据
        List<Module> moduleList = moduleService.findAll();
        //3.根据角色ID查询已经分配的模块
        List<Module> roleModuleList = moduleService.findRoleModuleByRoleId(roleid);
        //4.封装List数据（ztree需要的数据）
        if (moduleList != null) {
            for (Module module : moduleList) {
                //4.1 创建Map集合封装一个节点数据
                Map<String, Object> map = new HashMap<>();
                //4.2 封装数据： { id:1, pId:0, name:"Saas管理", open:true}
                map.put("id", module.getId());
                map.put("pId", module.getParentId());
                map.put("name", module.getName());
                map.put("open", true);

                //如果分配过的权限节点，需要添加checked为true值
                //算法一：从已经分配的模块选出需要添加checked的模块
                /*for(Module module2:roleModuleList){
                    if(module2.getId()==module.getId()){
                        map.put("checked",true);
                    }
                }*/

                //算法二：使用List的contains方法筛选(注意：：contains默认情况下比较的对象的地址是否相同，可以重写hashcode和equals方法，编写比较逻辑)
                if (roleModuleList.contains(module)) {
                    map.put("checked", true);
                }

                //4.3 把Map存入List中
                list.add(map);
            }
        }
        //返回数据
        return list;
    }

    /**
     * //修改权限模块
     * 访问路径： http://localhost:8080/system/role/updateRoleModule.do
     * 方法参数：roleid=4028a1c34ec2e5c8014ec2ebf8430001
     * 方法返回：json字符窜
     */
    @RequestMapping("/updateRoleModule")

    public String updateRoleModule(String roleid, String moduleIds) {

        //更新角色分配的权限
        roleService.updateRoleModule(roleid, moduleIds);
        return "redirect:/system/role/list.do";
    }
}
